package com.rickpan.dto.request;

import com.rickpan.entity.GeneratedReport;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.time.LocalDate;

/**
 * 保存报告请求DTO
 */
@Data
public class SaveReportRequest {

    /**
     * 报告类型
     */
    @NotNull(message = "报告类型不能为空")
    private GeneratedReport.ReportType type;

    /**
     * 开始日期
     */
    @NotNull(message = "开始日期不能为空")
    private LocalDate startDate;

    /**
     * 结束日期
     */
    @NotNull(message = "结束日期不能为空")
    private LocalDate endDate;

    /**
     * 报告内容
     */
    @NotBlank(message = "报告内容不能为空")
    private String content;

    /**
     * 报告标题（可选，如果不提供则自动生成）
     */
    private String title;

    /**
     * 验证日期范围
     */
    public void validateDateRange() {
        if (startDate.isAfter(endDate)) {
            throw new IllegalArgumentException("开始日期不能晚于结束日期");
        }

        LocalDate now = LocalDate.now();
        if (startDate.isAfter(now)) {
            throw new IllegalArgumentException("开始日期不能是未来日期");
        }

        // 根据报告类型验证日期范围
        switch (type) {
            case DAILY:
                if (!startDate.equals(endDate)) {
                    throw new IllegalArgumentException("日报的开始日期和结束日期必须相同");
                }
                break;
            case WEEKLY:
                if (startDate.plusDays(6).isBefore(endDate) || startDate.plusDays(13).isAfter(endDate)) {
                    throw new IllegalArgumentException("周报的日期范围应该在7-14天之间");
                }
                break;
            case MONTHLY:
                if (startDate.plusDays(27).isAfter(endDate) || startDate.plusDays(35).isBefore(endDate)) {
                    throw new IllegalArgumentException("月报的日期范围应该在28-35天之间");
                }
                break;
        }
    }
}
